package lampsServer;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

import bean.ServerBean;

public class ServerView extends JFrame{
	//序列号
	private static final long serialVersionUID = 1L;
	//路灯控制器面板
	private JPanel contentPane;
	//路灯信息表
	public  JTable table;
	//开灯按钮
	private JButton openButton;
	//关灯按钮
	private JButton shutButton;
	//各路灯详细信息显示面板
	private JPanel infoPanel;
	//路灯列表
	@SuppressWarnings("rawtypes")
	public JList list;
	//承载路灯列表的面板
	private JPanel lampsPanel;
	//列表单元格样式
	public MyCellRenderer myCellRenderer=null;
	//列表滚动视口
	private JScrollPane scrollPane;
	//LampsServer对象
	private LampsServer  lampsServer= null;
	
	//LampsServer传给Serverview其对象的方法
	public void setCatServer(LampsServer lampsServer) {
		this.lampsServer =lampsServer;
	}
	
	//路灯控制器窗口默认构造函数
	public ServerView() {	
		init();
	}		
	//路灯控制器窗口初始化
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void  init() {
		Font font =new Font("宋体",22,16);
		setTitle("路灯控制器");
		setFont(font);
		//退出程序后默认窗口关闭
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//设置窗口为未知
		setBounds(600, 250, 789, 428);
		//用户不可调节窗口大小
		setResizable(false);
		//控制器面板
		contentPane = new JPanel(){
			private static final long serialVersionUID = 1L;
			//设置控制器面板的背景
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.drawImage(new ImageIcon("images\\背景.jpg").getImage(), 0, 0,
						getWidth(), getHeight(), null);
			}
		};
		//面板不透明
		contentPane.setOpaque(true);
		//设置面板边框
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		//将此面板设置为窗口的最外层容器
		setContentPane(contentPane);
		//面板无布局（即自定义）
		contentPane.setLayout(null);
		
		//新建一个面板用于显示已连接服务器的路灯
		lampsPanel = new JPanel();
		//设置面板位置和大小
		lampsPanel.setBounds(10, 10, 164, 316);
		//将路灯列表面板加入最外层容器
		contentPane.add(lampsPanel);
		//指定路灯列表面板的布局为边框布局，上下左右组件间距都为0
		lampsPanel.setLayout(new BorderLayout(0, 0));
		
		//创建一个可滚动视口
		scrollPane = new JScrollPane();
		//设置视口的边界框，且边框具有标题
		scrollPane.setViewportBorder(new TitledBorder(null, "已连接路灯列表"
				, TitledBorder.LEADING, TitledBorder.TOP, new Font("微软雅黑", Font.BOLD, 18), null));
		//将该视口加入路灯列表面板
		lampsPanel.add(scrollPane, BorderLayout.CENTER);

		//显示已连接服务器的各路灯的列表
		list = new JList();
		//确定列表单元格样式
		myCellRenderer = new MyCellRenderer();
		//绘制列表单元格
		list.setCellRenderer(myCellRenderer);
		//将路灯列表加入可滚动视口，当加入路灯很多的时候可以滑动滚动条寻找所需路灯
		scrollPane.setViewportView(list);
		
		//显示各路灯详细信息的面板
		infoPanel = new JPanel();
		//设置面板位置和大小
		infoPanel.setBounds(185, 10, 588, 376);
		//设置带标题的边框
		infoPanel.setBorder(new TitledBorder(null, "各路灯详细信息"
				, TitledBorder.LEADING, TitledBorder.TOP, new Font("微软雅黑", Font.BOLD, 18), null));
		//将此面板加入最外层容器
		contentPane.add(infoPanel);
		//指定路灯列表面板的布局为边框布局，上下左右组件间距都为0
		infoPanel.setLayout(new BorderLayout(0, 0));
		
		//存储各路灯消息信息的表格
		table = new JTable();
		//该表格用户只能查看，不能更改
		table.setEnabled(false);
		table.setFont(new Font("微软雅黑", Font.BOLD, 16));
		//将表格插入路灯信息面板
		infoPanel.add(table, BorderLayout.NORTH);

		//开灯按钮
		openButton = new JButton("开灯");
		//按钮字体样式
		openButton.setFont(new Font("微软雅黑", Font.BOLD, 20));
		//按钮位置和大小
		openButton.setBounds(10, 336, 77, 50);
		//按钮背景
		openButton.setIcon(new ImageIcon("images\\绿色.png"));
		//显示文字
		openButton.setHorizontalTextPosition(SwingConstants.CENTER);
		//给按钮注册事件
		openButton.addMouseListener(new MouseAdapter() {
			//点击时调用
			@Override
			public void mouseClicked(MouseEvent e) {
				//向客户端发送开灯命令
				send(1);
			}
		});
		//按钮加入最外层容器
		contentPane.add(openButton);
		
		//关灯按钮
		shutButton = new JButton("关灯");
		//按钮字体样式
		shutButton.setFont(new Font("微软雅黑", Font.BOLD, 20));
		//按钮位置和大小
		shutButton.setBounds(97, 336, 77, 50);
		//按钮背景
		shutButton.setIcon(new ImageIcon("images\\红色.png"));
		//显示字体
		shutButton.setHorizontalTextPosition(SwingConstants.CENTER);
		//给按钮注册事件
		shutButton.addMouseListener(new MouseAdapter() {
			//点击按钮时调用
			@Override
			public void mouseClicked(MouseEvent e) {
				//向客户端发送关灯命令
				send(0);
			}
		});
		//按钮加入最外层容器
		contentPane.add(shutButton);
	}
	@SuppressWarnings({ "rawtypes", "static-access" })
	public void send(int type) {
		//遍历列表寻找选中的路灯对象
		List to = list.getSelectedValuesList();
		if (to.size() < 1) {
			//JOptionPane可以轻松地弹出一个标准对话框，提示用户获取值或通知他们某些东西
			//获取当前容器，在其中弹出一个对话框
			JOptionPane.showMessageDialog(getContentPane(), "请选择所要操作的路灯对象");
			return;
		} else {
			//获取对应的serverBean
			ServerBean serverBean = new ServerBean();
			//获取对应的客户端socket
			Socket clientSocket = lampsServer.clientSockets.get(to.get(0).toString());
			System.out.println(clientSocket);
			serverBean.setLampId(to.get(0).toString());
			//给客户端下发type命令
			serverBean.setType(type);
			System.out.println(serverBean.getLampId());
			System.out.println(serverBean.getType());
			//创建一个输出流
			ObjectOutputStream oos = null;
			try {
				//根据客户端socket实例化输出流
				oos = new ObjectOutputStream(clientSocket.getOutputStream());
				System.out.println(oos.toString());
				//将对象写入输出流
				oos.writeObject(serverBean);
				//清空缓冲
				oos.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
	